/*
谓词：返回bool值的函数或函数对象，用于判断某个条件是否成立
 在 C++ 中，谓词常用于标准模板库（STL）中的算法，对元素进行筛选、比较等操作
一元谓词  接受一个参数并返回布尔值的函数或函数对象
		 find_if、count_if、remove_if
		用普通函数或函数对象来实现一元谓词
二元谓词  接受两个参数并返回布尔值的函数或函数对象
		  sort、unique、merge
		  二元谓词用于比较两个元素，确定其相对关系，如排序、合并等操作


*/

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

// // 定义一个函数，判断是否为奇数
// bool isOdd(int n)
// {
// 	return n % 2 != 0;
// }

// int main(int argc, char const *argv[])
// {

// 	// 使用函数判断奇偶

// 	// 定义一个vector 容器
// 	vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8, 9};

// 	// 只能找到第一个
// 	vector<int>::iterator it = find_if(vec.begin(), vec.end(), isOdd);

// 	if (it != vec.end())
// 	{
// 		cout << "找到奇数：" << *it << endl;
// 	}
// 	else
// 	{
// 		cout << "未找到奇数" << endl;
// 	}
// 	// 第一种方法，找到所有

// 	std::for_each(vec.begin(), vec.end(), [](int n)
// 				  {
//         if (isOdd(n)) {
//             std::cout << "奇数: " << n << std::endl;
//         } });

// 	// 方法二：使用范围 for 循环
// 	// 对于 vec 中的每个元素 num，调用 isOdd(num) 进行判断。
// 	for (int num : vec)
// 	{
// 		if (isOdd(num))
// 		{
// 			std::cout << "奇数: " << num << std::endl;
// 		}
// 	}
// 	return 0;

// }

// 定义一个函数对象，判断是否为负数
class IsNegative
{
public:
	bool operator()(int n) const
	{
		return n < 0;
	}
};

int main()
{
	vector<int> numbers = {3, -1, 4, -5, 9};

	// 使用 count_if 统计负数的个数
	// count_if 算法会对 numbers 容器中 numbers.begin() 到 numbers.end() 范围内的
	// 每个元素调用 IsNegative 对象的 operator() 运算符进行判断，
	int count = count_if(numbers.begin(), numbers.end(), IsNegative());
	cout << "负数的个数：" << count << endl;

	return 0;
}
/*
第一个代码使用 count_if 算法结合函数对象，目的是统计满足条件（为负数）的元素的个数；
而第二个代码使用 find_if 算法结合普通函数，目的是查找第一个满足条件（为奇数）的元素。
这就是两者功能的区别，count_if 统计满足条件元素的数量，
					而 find_if 仅查找满足条件的第一个元素。

*/